import datetime

from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings

from web import models


class AuthMiddleware(MiddlewareMixin):
    """用中间件判断登录状态"""

    # 进行登录验证,没有获取到session信息就重定向到登录页面
    def process_request(self, request):  # process
        # 1.排除开登录页面不进行session验证
        if request.path_info in settings.WHITE_REGEX_URL_LIST:  # request.path_info能获取到请求的路径
            return
        session_user = request.session.get("user")  # 2.获取存放的session信息，有就给访问，没有就返回登录页面
        if not session_user:
            return redirect('/paslogin/')  # process_request返回空或不返回则不拦截继续往下走，返回信息的话就从此处返回了，不会继续往后面视图函数走
        # 方式一:免费额度在交易记录中存储
        # 2.登录成功后讲将用户的当前套餐额度查出来并存进request中，方便后面的页面使用
        # 获取当前用户ID值最大的交易记录(即最新一条记录)
        _obj = models.Transaction.objects.filter(user=session_user.get("id"), status=2).order_by('-id').first()
        # 判断是否过期(如果结束时间存在且小于当前时间)
        cur_date = datetime.datetime.now()
        if _obj.end_datetime and _obj.end_datetime < cur_date:
            _obj = models.Transaction.objects.filter(user=session_user.get("id"), status=2,
                                                     price_policy__category=1).first()  # 当过期了就启用免费版，没过期就用最新的
        request.transaction = _obj
        return

    def process_view(self, request, view, args, kwargs):
        # 1.判断是否是以manage路径访问（是则进入项目了）,如果是则判断项目ID是否是我创建的或参与的
        if not request.path_info.startswith('/manage/'):
            return

        project_id = kwargs.get('project_id')  # 获取项目id
        # 是否是我创建的
        pro_obj = models.Project.objects.filter(creator=request.transaction.user, id=project_id).first()
        if pro_obj:
            request.manage = pro_obj
            return
        # 是否是我参与的
        pro_user_obj = models.ProjectUser.objects.filter(user=request.transaction.user, project_id=project_id).first()
        if pro_user_obj:
            request.manage = pro_user_obj.project
            return

        return redirect('project_list')
